package com.tan.kotlintest.annotation;


import android.app.Activity;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/*
 * Copyright (C) 2018 重庆一聊高科技有限公司
 * 版权所有
 *
 * 功能描述:  注解管理类
 * 作者：txj
 * 创建时间：2018/9/18
 *
 * 修改人：
 * 修改描述：
 * 修改日期
 */
class InjectManager {

    static void inject(Activity activity) {
        //注入布局
        injectLayout(activity);
        //注入findViewById属性
        injectProperty(activity);
        //注入点击事件
        injectClickListener(activity);
    }

    /**
     * 注入布局
     *
     * @param activity 目标activity
     */
    private static void injectLayout(Activity activity) {
        //获取类
        Class<? extends Activity> clazz = activity.getClass();
        //获取ContentView注解
        ContentView contentView = clazz.getAnnotation(ContentView.class);
        if (contentView != null) {
            //获取layoutId
            int layoutId = contentView.value();
            if (layoutId > 0) {
                //调用setContentView方法
                try {
                    Method me = clazz.getMethod("setContentView", int.class);
                    me.invoke(activity, layoutId);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 注入属性
     *
     * @param activity 目标activity
     */
    private static void injectProperty(Activity activity) {
        //获取类
        Class<? extends Activity> clazz = activity.getClass();
        //获取当前类的属性
        Field[] declaredFields = clazz.getDeclaredFields();
        for (Field field : declaredFields) {
            //如果有InjectView注解
            InjectView annotation = field.getAnnotation(InjectView.class);
            if (annotation != null) {
                int id = annotation.value();
                if (id > 0) {
                    try {
                        //调用findViewById(id)方法
                        Method me = clazz.getMethod("findViewById", int.class);
                        Object view = me.invoke(activity, id);
                        //私有属性 设置成为可操作(反射特色、重要的知识点)
                        field.setAccessible(true);
                        //设置属性: 参数  目标类(activity)  值
                        field.set(activity, view);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    /**
     * 注入点击事件
     */
    private static void injectClickListener(Activity activity) {
        Class<? extends Activity> clazz = activity.getClass();



    }

}
